﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using Fuyao.Business.Entities.Models;

namespace Fuyao.Data.SQLServer.DAO
{
    public class DAOProducto
    {
        string strCnx = clsConexionDB.getConexionSQL();

        public bool InsertProducto(Producto BE)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("INSERT INTO dbo.Producto (CodigoProducto, Caracteristica,Caracteristica2, DescripcionProducto,CreadoPor, FechaCreacion,Precio, Descuento, Estado,Alto,Ancho,Cantidad,EsParabrisaFrontal,CategoriaAuto) ");
                strCommand.Append("VALUES (@CodigoProducto,@Caracteristica,@Caracteristica2,@DescripcionProducto,@CreadoPor,getDate(),@Precio,@Descuento, 1,@Alto,@Ancho,@Cantidad,@EsParabrisaFrontal,@CategoriaAuto)");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@CodigoProducto", SqlDbType.VarChar, 50).Value = BE.CodigoProducto;
                sqlCommand.Parameters.Add("@Caracteristica", SqlDbType.VarChar, 50).Value = BE.Caracteristica;
                sqlCommand.Parameters.Add("@Caracteristica2", SqlDbType.VarChar, 50).Value = BE.Caracteristica2;
                sqlCommand.Parameters.Add("@DescripcionProducto", SqlDbType.VarChar, 200).Value = BE.DescripcionProducto;
                sqlCommand.Parameters.Add("@Precio", SqlDbType.Decimal).Value = BE.Precio;
                sqlCommand.Parameters.Add("@Descuento", SqlDbType.Decimal).Value = BE.Descuento;
                sqlCommand.Parameters.Add("@CreadoPor", SqlDbType.Int).Value = BE.CreadoPor;
                sqlCommand.Parameters.Add("@Alto", SqlDbType.Decimal).Value = BE.Alto;
                sqlCommand.Parameters.Add("@Ancho", SqlDbType.Decimal).Value = BE.Ancho;
                sqlCommand.Parameters.Add("@Cantidad", SqlDbType.Int).Value = BE.Cantidad;
                sqlCommand.Parameters.Add("@EsParabrisaFrontal", SqlDbType.Bit).Value = BE.EsParabrisaFrontal;
                sqlCommand.Parameters.Add("@CategoriaAuto", SqlDbType.VarChar,50).Value = BE.CategoriaAuto;
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }

        public bool UpdateProducto(Producto BE)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("UPDATE dbo.Producto set CodigoProducto=@CodigoProducto, Caracteristica=@Caracteristica,Caracteristica2=@Caracteristica2, DescripcionProducto=@DescripcionProducto, FechaModificacion=getDate(),Precio=@Precio, Descuento=@Descuento, Estado=@Estado,ModificadoPor=@ModificadoPor,Alto=@Alto,Ancho=@Ancho,Cantidad=@Cantidad,EsParabrisaFrontal=@EsParabrisaFrontal,CategoriaAuto=@CategoriaAuto  ");
                strCommand.Append("WHERE ProductoID = @ProductoID ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@ProductoID", SqlDbType.Int).Value = BE.ProductoID;
                sqlCommand.Parameters.Add("@CodigoProducto", SqlDbType.VarChar, 50).Value = BE.CodigoProducto;
                sqlCommand.Parameters.Add("@Caracteristica", SqlDbType.VarChar, 50).Value = BE.Caracteristica;
                sqlCommand.Parameters.Add("@Caracteristica2", SqlDbType.VarChar, 50).Value = BE.Caracteristica2;
                sqlCommand.Parameters.Add("@DescripcionProducto", SqlDbType.VarChar, 200).Value = BE.DescripcionProducto;
                sqlCommand.Parameters.Add("@Precio", SqlDbType.Decimal).Value = BE.Precio;
                sqlCommand.Parameters.Add("@Descuento", SqlDbType.Decimal).Value = BE.Descuento;
                sqlCommand.Parameters.Add("@Estado", SqlDbType.Bit).Value = BE.Estado;
                sqlCommand.Parameters.Add("@ModificadoPor", SqlDbType.Int).Value = BE.CreadoPor;
                sqlCommand.Parameters.Add("@Alto", SqlDbType.Decimal).Value = BE.Alto;
                sqlCommand.Parameters.Add("@Ancho", SqlDbType.Decimal).Value = BE.Ancho;
                sqlCommand.Parameters.Add("@Cantidad", SqlDbType.Int).Value = BE.Cantidad;
                sqlCommand.Parameters.Add("@EsParabrisaFrontal", SqlDbType.Bit).Value = BE.EsParabrisaFrontal;
                sqlCommand.Parameters.Add("@CategoriaAuto", SqlDbType.VarChar, 50).Value = BE.CategoriaAuto;         
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }

        public bool DeleteProducto(int idProd, int idUserLogueado)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("UPDATE dbo.Producto set Estado=@Estado, FechaModificacion=getDate(),ModificadoPor=@ModificadoPor ");
                strCommand.Append("WHERE ProductoID = @ProductoID ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@ProductoID", SqlDbType.Int).Value = idProd;
                sqlCommand.Parameters.Add("@Estado", SqlDbType.Bit).Value = false;
                sqlCommand.Parameters.Add("@ModificadoPor", SqlDbType.Int).Value = idUserLogueado;
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }

        public List<Producto> getProductsByFilter(Producto BE)
        {
            Producto oProducto = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);
            List<Producto> listProductos = new List<Producto>();

            try
            {
                strCommand.Append("FYAO_getProductsByFiler");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.StoredProcedure;

                sqlCommand.Parameters.Add("@Codigo", SqlDbType.VarChar, 50).Value = BE.CodigoProducto;
                sqlCommand.Parameters.Add("@Caracteristica", SqlDbType.VarChar, 50).Value = BE.Caracteristica;
                sqlCommand.Parameters.Add("@Descripcion", SqlDbType.VarChar, 200).Value = BE.DescripcionProducto;
                sqlCommand.Parameters.Add("@Estado", SqlDbType.Bit).Value = BE.Estado;

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                while (dr.Read())
                {
                    oProducto = new Producto();
                    if (!Convert.IsDBNull(dr["ProductoID"])) oProducto.ProductoID = Convert.ToInt32(dr["ProductoID"]);
                    if (!Convert.IsDBNull(dr["CodigoProducto"])) oProducto.CodigoProducto = Convert.ToString(dr["CodigoProducto"]);
                    if (!Convert.IsDBNull(dr["Caracteristica"])) oProducto.Caracteristica = Convert.ToString(dr["Caracteristica"]);
                    if (!Convert.IsDBNull(dr["Caracteristica2"])) oProducto.Caracteristica2 = Convert.ToString(dr["Caracteristica2"]);
                    if (!Convert.IsDBNull(dr["DescripcionProducto"])) oProducto.DescripcionProducto = Convert.ToString(dr["DescripcionProducto"]);
                    if (!Convert.IsDBNull(dr["Descuento"])) oProducto.Descuento = Convert.ToDecimal(dr["Descuento"]);
                    if (!Convert.IsDBNull(dr["Precio"])) oProducto.Precio = Convert.ToDecimal(dr["Precio"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oProducto.Estado = Convert.ToBoolean(dr["Estado"]);
                    if (!Convert.IsDBNull(dr["Alto"])) oProducto.Alto = Convert.ToDecimal(dr["Alto"]);
                    if (!Convert.IsDBNull(dr["Ancho"])) oProducto.Ancho = Convert.ToDecimal(dr["Ancho"]);
                    if (!Convert.IsDBNull(dr["Cantidad"])) oProducto.Cantidad = Convert.ToInt32(dr["Cantidad"]);
                    if (!Convert.IsDBNull(dr["CategoriaAuto"])) oProducto.CategoriaAuto = Convert.ToString(dr["CategoriaAuto"]);
                    if (!Convert.IsDBNull(dr["EsParabrisaFrontal"])) oProducto.EsParabrisaFrontal = Convert.ToBoolean(dr["EsParabrisaFrontal"]);
                    listProductos.Add(oProducto);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return listProductos;
        }

        public Producto getProductsById(int ProdID)
        {
            Producto oProducto = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("SELECT ProductoID,CodigoProducto,Caracteristica,Caracteristica2,DescripcionProducto,isnull(Precio,0) Precio, ");
                strCommand.Append("isnull(Descuento,0) Descuento,isnull(Alto,0) Alto,isnull(Ancho,0) Ancho,isnull(Cantidad,0) Cantidad,CategoriaAuto, ");
                strCommand.Append("isnull(EsParabrisaFrontal,0) EsParabrisaFrontal,Estado FROM Producto WHERE ProductoID=@ProdID");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.Text;

                sqlCommand.Parameters.Add("@ProdID", SqlDbType.Int).Value = ProdID;              

                cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                if (dr.Read())
                {
                    oProducto = new Producto();
                    if (!Convert.IsDBNull(dr["ProductoID"])) oProducto.ProductoID = Convert.ToInt32(dr["ProductoID"]);
                    if (!Convert.IsDBNull(dr["CodigoProducto"])) oProducto.CodigoProducto = Convert.ToString(dr["CodigoProducto"]);
                    if (!Convert.IsDBNull(dr["Caracteristica"])) oProducto.Caracteristica = Convert.ToString(dr["Caracteristica"]);
                    if (!Convert.IsDBNull(dr["Caracteristica2"])) oProducto.Caracteristica2 = Convert.ToString(dr["Caracteristica2"]);
                    if (!Convert.IsDBNull(dr["DescripcionProducto"])) oProducto.DescripcionProducto = Convert.ToString(dr["DescripcionProducto"]);
                    if (!Convert.IsDBNull(dr["Descuento"])) oProducto.Descuento = Convert.ToDecimal(dr["Descuento"]);
                    if (!Convert.IsDBNull(dr["Precio"])) oProducto.Precio = Convert.ToDecimal(dr["Precio"]);
                    if (!Convert.IsDBNull(dr["Estado"])) oProducto.Estado = Convert.ToBoolean(dr["Estado"]);
                    if (!Convert.IsDBNull(dr["Alto"])) oProducto.Alto = Convert.ToDecimal(dr["Alto"]);
                    if (!Convert.IsDBNull(dr["Ancho"])) oProducto.Ancho = Convert.ToDecimal(dr["Ancho"]);
                    if (!Convert.IsDBNull(dr["Cantidad"])) oProducto.Cantidad = Convert.ToInt32(dr["Cantidad"]);
                    if (!Convert.IsDBNull(dr["CategoriaAuto"])) oProducto.CategoriaAuto = Convert.ToString(dr["CategoriaAuto"]);
                    if (!Convert.IsDBNull(dr["EsParabrisaFrontal"])) oProducto.EsParabrisaFrontal = Convert.ToBoolean(dr["EsParabrisaFrontal"]);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return oProducto;
        }

        public List<Producto> getCategoriaProducto()
        {
            List<Producto> listProducto = new List<Producto>();
            Producto oProducto = null;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("select distinct upper(CategoriaAuto) as CategoriaAuto from producto order by CategoriaAuto ");
                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.CommandType = CommandType.Text;

                 cnx.Open();
                SqlDataReader dr = sqlCommand.ExecuteReader();

                while (dr.Read())
                {
                    oProducto = new Producto();
                    if (!Convert.IsDBNull(dr["CategoriaAuto"])) oProducto.CategoriaAuto = Convert.ToString(dr["CategoriaAuto"]);
                    listProducto.Add(oProducto);
                }

                dr.Close();
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return listProducto;
        }

        public bool UpdatePrecio(int ProductoID, decimal Precio, int idUserLogueado)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("UPDATE dbo.Producto set Precio=@Precio, FechaModificacion=getDate(),ModificadoPor=@ModificadoPor ");
                strCommand.Append("WHERE ProductoID = @ProductoID ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@ProductoID", SqlDbType.Int).Value = ProductoID;
                sqlCommand.Parameters.Add("@Precio", SqlDbType.Decimal).Value = Precio;
                sqlCommand.Parameters.Add("@ModificadoPor", SqlDbType.Int).Value = idUserLogueado;
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }


        public bool UpdateDescuento(int ProductoID, decimal Descuento, int idUserLogueado)
        {
            bool _result = false;
            StringBuilder strCommand = new StringBuilder();
            SqlConnection cnx = new SqlConnection(strCnx);

            try
            {
                strCommand.Append("UPDATE dbo.Producto set Descuento=@Descuento, FechaModificacion=getDate(),ModificadoPor=@ModificadoPor ");
                strCommand.Append("WHERE ProductoID = @ProductoID ");

                SqlCommand sqlCommand = new SqlCommand(strCommand.ToString(), cnx);
                sqlCommand.Parameters.Add("@ProductoID", SqlDbType.Int).Value = ProductoID;
                sqlCommand.Parameters.Add("@Descuento", SqlDbType.Decimal).Value = Descuento;
                sqlCommand.Parameters.Add("@ModificadoPor", SqlDbType.Int).Value = idUserLogueado;
                cnx.Open();
                _result = Convert.ToBoolean(sqlCommand.ExecuteNonQuery());

            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnx.Close();
            }
            return _result;
        }
    }
}
